package com.myself.cloud.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 接口返回通用实体
 *
 * @param <T> 数据实体类型
 */
@Data
public class ResultEntity<T> implements Serializable {
    public static final int STATUS_SUCCESS = 1;
    public static final int STATUS_ERROR = 0;
    public static final String MSG_SUCCESS = "OK";
    public static final String MSG_ERROR = "ERROR";
    @ApiModelProperty(value = "返回类型")
    private T result;
    @ApiModelProperty(value = "返回时间戳")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime timestamp;
    @ApiModelProperty(value = "返回状态默认1-成功 0-失败")
    private int status;
    @ApiModelProperty(value = "错误或成功信息")
    private String message;

    /**
     * 禁止外部实例化
     */
    private ResultEntity() {
        this.status = STATUS_ERROR;
        this.message = MSG_ERROR;
        this.timestamp = LocalDateTime.now();
    }

    /**
     * 返回封装实体数据
     *
     * @param t       实体类对象
     * @param status  状态码
     * @param message 消息
     * @param <T>     泛型
     * @return
     */
    public static <T> ResultEntity<T> result(T t, int status, String message) {
        ResultEntity<T> entity = new ResultEntity<>();
        entity.setResult(t);
        entity.setStatus(status);
        entity.setMessage(message);
        return entity;
    }

    /**
     * 返回成功实体
     *
     * @param t       实体类对象
     * @param status  状态码
     * @param message 消息
     * @param <T>     泛型
     * @return
     */
    public static <T> ResultEntity<T> success(T t, int status, String message) {
        return result(t, status, message);
    }

    /**
     * 返回成功实体
     *
     * @param t       实体类对象
     * @param message 消息
     * @param <T>
     * @return
     */
    public static <T> ResultEntity<T> success(T t, String message) {
        return success(t, STATUS_SUCCESS, message);
    }

    /**
     * 返回成功实体
     *
     * @param t      实体类对象
     * @param status 状态码
     * @param <T>    泛型
     * @return
     */
    public static <T> ResultEntity<T> success(T t, int status) {
        return success(t, status, MSG_SUCCESS);
    }

    public static <T> ResultEntity<T> success(int status, String message) {
        return success(null, status, message);
    }

    /**
     * 返回成功实体
     *
     * @param t   实体类对象
     * @param <T> 泛型
     * @return
     */
    public static <T> ResultEntity<T> success(T t) {
        return success(t, STATUS_SUCCESS);
    }

    /**
     * @param status 状态码
     * @param <T>    泛型
     * @return
     */
    public static <T> ResultEntity<T> success(int status) {
        return success(status, MSG_SUCCESS);
    }

    /**
     * 返回成功实体
     *
     * @param message 消息
     * @param <T>
     * @return
     */
    public static <T> ResultEntity<T> success(String message) {
        return success(STATUS_SUCCESS, message);
    }

    public static <T> ResultEntity<T> success() {
        return success(MSG_SUCCESS);
    }

    /**
     * 返回错误消息
     *
     * @param status  状态码
     * @param message 消息
     * @param t       数据实体类对象
     * @param <T>
     * @return
     */
    public static <T> ResultEntity<T> error(T t, int status, String message) {
        return result(t, status, message);
    }

    public static <T> ResultEntity<T> error(T t, int status) {
        return error(t, status, MSG_ERROR);
    }

    public static <T> ResultEntity<T> error(T t, String message) {
        return error(t, STATUS_ERROR, message);
    }

    /**
     * 返回错误消息
     *
     * @param status  状态码
     * @param message 消息
     * @param <T>
     * @return
     */
    public static <T> ResultEntity<T> error(int status, String message) {
        return error(null, status, message);
    }

    /**
     * 返回错误消息
     *
     * @param message 消息
     * @param <T>
     * @return
     */
    public static <T> ResultEntity<T> error(String message) {
        return error(STATUS_ERROR, message);
    }

    /**
     * 返回错误消息
     *
     * @param status 状态码
     * @param <T>
     * @return
     */
    public static <T> ResultEntity<T> error(int status) {
        return error(status, MSG_ERROR);
    }
}
